
package model;

import java.util.ArrayList;
import model.persistencia.ProdutoDAO;

public class ProdutoModel implements IProduto{
    
    private String descricao,auditoria;
    private double valorCompra, valorVenda;
    private int codigo, estoque, estoqueCritico; 
    private ProdutoDAO produtoDAO;
    private IUnidade unidade;
    private ICategoria categoria;
    private IFornecedor fornecedor;
    private ArrayList observers;
    
    private static ProdutoModel instance = null;

    public synchronized static ProdutoModel getInstance(){
        if (instance == null) {
            instance = new ProdutoModel();
        }
        return instance;
    }

    public ProdutoModel() {
        produtoDAO = new ProdutoDAO(this);
        observers = new ArrayList();
    }   

    public ProdutoModel(String descricao, IFornecedor fornecedor, IUnidade unidade, 
            CategoriaModel categoria, double valorCompra, double valorVenda, int codigo, int estoque, int estoqueCritico, String auditoria) {
        this.descricao = descricao;
        this.fornecedor = fornecedor;
        this.unidade = unidade;
        this.categoria = categoria;
        this.valorCompra = valorCompra;
        this.valorVenda = valorVenda;
        this.codigo = codigo;
        this.estoque = estoque;
        this.estoqueCritico = estoqueCritico; 
        this.auditoria = auditoria;
    }
    
    @Override
    public ProdutoModel getProduto(int codigo) {
        return produtoDAO.getObject(codigo);
    }
    
    @Override
    public ArrayList getAll() {
        return pesquisar(SQL_GETALL, "0");
    }
        
    @Override
    public void setProximoCodigo(){        
        int proximoCodigo = produtoDAO.getCodigo(SQL_ULTIMO,0) + 1;
        this.codigo = proximoCodigo;
    }    
    
    // <editor-fold defaultstate="collapsed" desc="GET e SET METODOS">
    @Override
    public String getDescricao() {
        return descricao;
    }

    @Override
    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }
    
    @Override
    public double getValorCompra() {
        return valorCompra;
    }

    @Override
    public void setValorCompra(double valorCompra) {
        this.valorCompra = valorCompra;
    }

    @Override
    public double getValorVenda() {
        return valorVenda;
    }

    @Override
    public void setValorVenda(double valorVenda) {
        this.valorVenda = valorVenda;
    }

    @Override
    public int getCodigo() {
        return codigo;
    }

    @Override
    public void setCodigo(int codigo) {
        this.codigo = codigo;
    }

    @Override
    public int getEstoque() {
        return estoque;
    }

    @Override
    public void setEstoque(int estoque) {
        this.estoque = estoque;
    }

    @Override
    public int getEstoqueCritico() {
        return estoqueCritico;
    }

    @Override
    public void setEstoqueCritico(int estoqueCritico) {
        this.estoqueCritico = estoqueCritico;
    }
    
    @Override
    public String getAuditoria() {
        return auditoria;
    }

    @Override
    public void setAuditoria(String auditoria) {
        this.auditoria = auditoria;
    }
    
    @Override
    public IUnidade getUnidade() {
        return unidade;
    }

    @Override
    public void setUnidade(IUnidade unidade) {
        this.unidade = unidade;
    }

    @Override
    public ICategoria getCategoria() {
        return categoria;
    }

    @Override
    public void setCategoria(ICategoria categoria) {
        this.categoria = categoria;
    }

    @Override
    public IFornecedor getFornecedor() {
        return fornecedor;
    }

    @Override
    public void setFornecedor(IFornecedor fornecedor) {
        this.fornecedor = fornecedor;
    }
    // </editor-fold>

    //<editor-fold defaultstate="collapsed" desc="GRUD">
    @Override
    public void inserir(){
        produtoDAO.inserir();
        notificarObservers();
    }
    
    @Override
    public void atualizar(){
        produtoDAO.atualizar();
        notificarObservers();
    }
    
    @Override
    public void excluir(){
        produtoDAO.excluir();
        notificarObservers();
    }
    
    @Override
    public ArrayList pesquisar(int iOpcao, String iPesquisa) {
        return produtoDAO.pesquisar(iOpcao, iPesquisa);
    }
    //</editor-fold>   

    //<editor-fold defaultstate="collapsed" desc="OBSERVER">
    @Override
    public void registrarObserver(Observer o) {
        observers.add(o);
    }
    
    @Override
    public void removerObserver(Observer o) {
        int i = observers.indexOf(o);
        if (i >= 0){
            observers.remove(i);
        }
    }
    
    @Override
    public void notificarObservers() {
        for (int i = 0;i < observers.size();i++){
            Observer observer = (Observer) observers.get(i);
            observer.update();
        }
    }
    //</editor-fold>  
   
}
